﻿Imports <xmlns:DataSet1="http://tempuri.org/DataSet1.xsd">

Public Class MigraLeccion

    'XML
    Private leccionXML As XElement
    Private pathFicheroXML As String
    'BD
    Private contexto As InterfazNegocio.TiposDatosSTE.ContenedorEntidades
    Private libro As New TiposDatosSTE.Libro
    Private seccion As New TiposDatosSTE.Seccion
    Private leccion As New TiposDatosSTE.Leccion

    Public Sub Procesa(ByVal pathFicheroXML As String, ByVal eliminaLeccionExistente As Boolean)

        Me.pathFicheroXML = pathFicheroXML
        contexto = New InterfazNegocio.TiposDatosSTE.ContenedorEntidades

        Dim fileContents As String
        fileContents = My.Computer.FileSystem.ReadAllText(pathFicheroXML)

        fileContents = fileContents.Replace("xmlns=""""", "")

        Dim x As XElement = XElement.Parse(fileContents)
        'Dim x As XElement = XElement.Load(pathFicheroXML)
        leccionXML = x.<DataSet1:Leccion>.Single

        TrataLibro()
        TrataSeccion()

        If eliminaLeccionExistente Then
            EliminaLeccion()
            'Guarda los cambios a base de datos
            contexto.SaveChanges()
        End If

        TrataLeccion()
        TrataEjercicios()
        TrataPaginas()

        'Guarda los cambios a base de datos
        contexto.SaveChanges()
        contexto.Dispose()

    End Sub


#Region "Libro"

    Private Sub TrataLibro()
        Dim nivelXML As XElement = leccionXML.<DataSet1:Nivel>.Single
        Dim volumenXML As XElement = leccionXML.<DataSet1:Volumen>.Single
        Dim ConsultaExisteLibro = From l In contexto.Libros
                                  Where l.Nivel = "Intermedio2" And l.Volumen = CDbl(volumenXML.Value)

        If ConsultaExisteLibro.Count = 0 Then
            'libro.Nivel = nivelXML.Value
            libro.Nivel = "Intermedio2"
            libro.Volumen = CInt(volumenXML.Value)
            contexto.Libros.AddObject(libro)
        Else
            libro = ConsultaExisteLibro.Single
        End If
    End Sub

#End Region

#Region "Seccion"

    Private Sub TrataSeccion()

        Dim tipoEjerXML As XElement = leccionXML.<DataSet1:TipoEjercicio>.Single
        Dim ConsultaExisteTipoEjercicio = From s In contexto.Secciones
                                          Where s.TipoEjercicio = tipoEjerXML.Value

        If ConsultaExisteTipoEjercicio.Count = 0 Then
            'Seccion.TipoEjercicio = tipoEjerXML.Value
            'contexto.AddToSecciones(Seccion)
            Throw New Exception("El siguiente Tipo de Ejercicio no existe en la tabla secciones: " & tipoEjerXML.Value)
        Else
            Seccion = ConsultaExisteTipoEjercicio.Single
        End If

    End Sub

#End Region

#Region "Leccion"

    Private Sub TrataLeccion()

        Dim temaXML As XElement = leccionXML.<DataSet1:Tema>.Single
        Dim ConsultaExisteLeccion = From l In contexto.Lecciones
                                    Where l.Nivel = libro.Nivel And l.Volumen = libro.Volumen _
                                    And l.TipoEjercicio = seccion.TipoEjercicio _
                                    And l.Tema = temaXML.Value

        If ConsultaExisteLeccion.Count = 0 Then
            leccion.Libro = libro
            leccion.Seccion = seccion
            leccion.Tema = temaXML.Value
            leccion.Audio = DameMp3(pathFicheroXML)

            contexto.Lecciones.AddObject(leccion)
        Else
            leccion = ConsultaExisteLeccion.Single
        End If

    End Sub

    Private Shared Function DameMp3(ByVal PathXml As String) As Byte()
        Dim pathMp3 As String = System.IO.Path.ChangeExtension(PathXml, "mp3")

        If System.IO.File.Exists(pathMp3) Then
            Return My.Computer.FileSystem.ReadAllBytes(pathMp3)
        Else
            Throw New Exception("No se ha encontrado el archivo mp3: " & pathMp3)
        End If

    End Function

    Private Sub EliminaLeccion()

        Dim temaXML As XElement = leccionXML.<DataSet1:Tema>.Single

        Dim delLeccion = From l In contexto.Lecciones
                                    Where l.Nivel = libro.Nivel And l.Volumen = libro.Volumen _
                                    And l.TipoEjercicio = seccion.TipoEjercicio _
                                    And l.Tema = temaXML.Value

        For Each l As TiposDatosSTE.Leccion In delLeccion
            contexto.Lecciones.DeleteObject(l)
        Next

    End Sub

#End Region

#Region "Ejercicios"

    Private Sub TrataEjercicios()

        Dim frases As XElement = leccionXML.<DataSet1:Frases>.Single
        Dim numEjercicio As Integer = 1
        For Each frase As XElement In frases.<DataSet1:Frase>

            If frase.<DataSet1:Ingles>.Single.Value.TrimStart.TrimEnd <> String.Empty Then

                Dim ejercicio As New TiposDatosSTE.Ejercicio

                ejercicio.Leccion = leccion
                ejercicio.NumEjercicio = numEjercicio

                ejercicio.Castellano = frase.<DataSet1:Castellano>.Single.Value.TrimStart.TrimEnd
                ejercicio.Ingles = frase.<DataSet1:Ingles>.Single.Value.TrimStart.TrimEnd

                ejercicio.Ingles = ejercicio.Ingles.Replace("’", "'")

                If ejercicio.Ingles.Split(CChar(" ")).Length <= 1 AndAlso ejercicio.TipoEjercicio <> "Números" Then
                    ejercicio.EsVocabulario = True
                End If

                If frase.<DataSet1:comentario>.Count > 0 Then
                    ejercicio.Comentario = frase.<DataSet1:comentario>.Single.Value.TrimStart.TrimEnd
                End If

                contexto.Ejercicios.AddObject(ejercicio)
                numEjercicio = numEjercicio + 1

            End If

        Next

    End Sub

#End Region

#Region "Paginas"

    Private Sub TrataPaginas()

        Dim numPagina As Integer = 1
        For Each tif As Byte() In DameImagenes(pathFicheroXML)
            Dim pagina As New TiposDatosSTE.Pagina

            pagina.Leccion = leccion
            pagina.NumPagina = numPagina
            pagina.Imagen = tif

            contexto.Paginas.AddObject(pagina)
            numPagina = numPagina + 1
        Next

    End Sub

    Private Shared Function DameImagenes(ByVal PathXml As String) As List(Of Byte())

        Dim i As Integer = 1
        Dim lista As New List(Of Byte())
        Dim pathTif As String = System.IO.Path.ChangeExtension(PathXml, i & ".tif")

        If System.IO.File.Exists(pathTif) Then
            lista.Add(My.Computer.FileSystem.ReadAllBytes(pathTif))
        Else
            Throw New Exception("No se ha encontrado el archivo tif: " & pathTif)
        End If

        For i = 2 To 100
            pathTif = System.IO.Path.ChangeExtension(PathXml, i & ".tif")

            If System.IO.File.Exists(pathTif) Then
                lista.Add(My.Computer.FileSystem.ReadAllBytes(pathTif))
            Else
                Exit For
            End If
        Next

        Return lista
    End Function

#End Region

End Class
